// 类


/* 
访问修饰符: 用来描述类内部的属性/方法的可访问性
  public: 默认值, 公开的类的内部外部都可以访问，子类的内部也能访问
  private: 只能当前类内部可以访问
  protected: 类内部和子类内部可以访问，类的外部不能访问
*/
(function(){

  class Person{
    // private gender:string
    protected gender:string
    name:string
    readonly age:number
    constructor(name:string,age:number,gender:string){
      this.name = name
      this.age = age
      this.gender = gender
    }
    eat():void{
      console.log('吃饭');
      console.log(this.gender); 
      //私有属性只能在父类当中去访问
      // 子类和外部都不能访问
    }
  }

  // 继承
  class Student extends Person{
    // name: string;
    // age:number
    studyNo:string
    constructor(name:string,age:number,studyNo:string,gender:string){
      super(name,age,gender)
      this.studyNo = studyNo
    }
    eat(): void {
      console.log('吃肉',this.gender);
      super.eat()
    }
  }

  let p1 = new Person('zly',35,'female')
  let s1 = new Student('zs',23,'001','male')
  // p1.age = 10 只读属性不能修改
  p1.eat()
  s1.eat()

  // console.log(p1.gender);   //被保护的属性外部不能访问，只能在父类或者子类当中访问
  // console.log(s1.gender)

  // 多态的表现
  // function prinEat(obj:Person):void{
  //   obj.eat()
  // }

  // prinEat(p1)
  // prinEat(s1)



})()


